home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #9 / Amiga Plus CD - 2004 - No. 09.iso / amigaplus / tools / dev_libs / feelin040718 / demos / class2.c < prev    next >
C/C++ Source or Header  |  2004-08-03  |  5KB  |  210 lines

  1. ;/*
  2.    F_Create.rexx EXE Class2 Feelin:Sources/_ASM/Rnd.o
  3.    QUIT
  4.    _________________________________________________________________________
  5.  
  6.    Class2 Demo © 2000-2003 by Olivier LAVIALE <HaploLaMain@aol.com>
  7.  
  8.    This example illustrate how to writte a  custom  class  using  a  methods
  9.    table instead of a dispatcher. This class doesn't use Dynamic IDs.
  10. */
  11.  
  12. #include <stdlib.h>
  13.  
  14. #include <libraries/feelin.h>
  15.  
  16. #include <proto/exec.h>
  17. #include <proto/dos.h>
  18. #include <proto/graphics.h>
  19. #include <proto/feelin.h>
  20.  
  21. struct FeelinBase *FeelinBase;
  22.  
  23. /* Here is the beginning of our simple new class... */
  24.  
  25. #define FM_Strobo                   FCCM_BASE
  26.  
  27. struct LocalObjectData
  28. {
  29.    FAreaData                       *AreaData;
  30.    struct FeelinSignalHandler       SignalHandler;
  31. };
  32.  
  33. /// mNew
  34. F_METHOD(ULONG,mNew)
  35. {
  36.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  37.  
  38.    LOD -> AreaData = (FAreaData *) F_Get(Obj,FA_AreaData);
  39.  
  40.    LOD -> SignalHandler.Object      = Obj;
  41.    LOD -> SignalHandler.Method      = FM_Strobo;
  42.    LOD -> SignalHandler.Flags       = FF_SignalHandler_Timer;
  43.    LOD -> SignalHandler.fsh_Secs    = 0;
  44.    LOD -> SignalHandler.fsh_Micros  = 30000;
  45.  
  46.    return F_SUPERDO();
  47. }
  48. //+
  49. /// mShow
  50. F_METHOD(LONG,mShow)
  51. {
  52.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  53.  
  54.    if (F_SUPERDO())
  55.    {
  56.       F_Do(_app,FM_Application_AddSignalHandler,&LOD -> SignalHandler);
  57.  
  58.       return TRUE;
  59.    }
  60.    return FALSE;
  61. }
  62. //+
  63. /// mHide
  64. F_METHOD(void,mHide)
  65. {
  66.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  67.  
  68.    if (FF_Area_CanShow & _flags)
  69.    {
  70.       F_Do(_app,FM_Application_RemSignalHandler,&LOD -> SignalHandler);
  71.    }
  72.    F_SUPERDO();
  73. }
  74. //+
  75. /// mAskMinMax
  76. /*
  77. AskMinMax method will be called before the  window  is  opened  and  before
  78. layout  takes place. We need to tell Feelin the minimum and maximum size of
  79. our object. Note that we indeed need to *add* these values,  not  just  set
  80. them !
  81. */
  82. F_METHOD(ULONG,mAskMinMax)
  83. {
  84.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  85.  
  86.    _minw += 30;
  87.    _minh += 30;
  88.  
  89. /*
  90. Now call our superclass. FC_Area will handle everything,  taking  care  of
  91. FA_FixedXxx, FA_MinXxx and FA_MaxXxx.
  92. */
  93.  
  94.    return F_SUPERDO();
  95. }
  96. //+
  97. /// mDraw
  98. /*
  99. Draw method is called whenever  Feelin  feels  (obviously  ;-))  we  should
  100. render our object. This usually happens after layout is finished. Note: You
  101. may  only  render  within  the  rectangle  _mx(Obj),  _my(Obj),  _mx2(Obj),
  102. _my2(Obj).
  103. */
  104. F_METHOD(void,mDraw)
  105. {
  106.    struct LocalObjectData *LOD = F_LOD(Class,Obj);
  107.    struct RastPort *rp = _rp;
  108.  
  109. /*
  110. let our superclass draw itself first, Area class would e.g. draw the  frame
  111. and clear the whole region. What it does exactly depends on flags.
  112. */
  113.  
  114.    F_SUPERDO();
  115.  
  116.    _APen(rand() % (1 << rp -> BitMap -> Depth));
  117.    _Boxf(_mx,_my,_mx2,_my2);
  118. }
  119. //+
  120. ///mStrobo
  121. F_METHOD(LONG,mStrobo)
  122. {
  123.    F_Draw(Obj,FF_Draw_Update);
  124.    return TRUE; // If we return FALSE the timer event won't be requested again
  125. }
  126. //+
  127.  
  128. ///Main
  129. void main()
  130. {
  131.    APTR app,win;
  132.    struct FeelinClass *cc;
  133.  
  134. /*
  135.    Methods handled by the class.
  136. */
  137.  
  138.    static struct FeelinMethodEntry Handlers[] =
  139.    {
  140.       (FMethod) mNew,       NULL, FM_New,
  141.       (FMethod) mShow,      NULL, FM_Show,
  142.       (FMethod) mHide,      NULL, FM_Hide,
  143.       (FMethod) mAskMinMax, NULL, FM_AskMinMax,
  144.       (FMethod) mDraw,      NULL, FM_Draw,
  145.       (FMethod) mStrobo,    NULL, FM_Strobo,
  146.  
  147.       NULL
  148.    };
  149.  
  150.    if (FeelinBase = (APTR) OpenLibrary("feelin.library",FV_VERSION))
  151.    {
  152.  
  153. /*
  154. Create the new custom class with a call to F_CreateClassA().
  155.  
  156. This function returns a struct FeelinClass. You must  use  cc  ->  Name  to
  157. create  instance  of  your  custom  class.  This Name is unique and made by
  158. F_CreateClassA().
  159. */
  160.  
  161.       if (cc = F_CreateClass(FA_Class_Super,          FC_Area,
  162.                              FA_Class_LODSize,        sizeof (struct LocalObjectData),
  163.                              FA_Class_MethodsTable,   Handlers,
  164.                              TAG_DONE))
  165.       {
  166.          app = AppObject,
  167.             FA_Application_Title,        "Class2",
  168.             FA_Application_Version,      "$VER: Class2 1.2 (2004/03/13)",
  169.             FA_Application_Copyright,    "© 2000-2003 Olivier LAVIALE",
  170.             FA_Application_Author,       "Olivier LAVIALE <HaploLaMain@aol.com>",
  171.             FA_Application_Description,  "Tutorial on Client.AddSignalHandler()",
  172.             FA_Application_Base,         "CLASS2",
  173.  
  174.             Child, win = WindowObject,
  175.                FA_ID,           "MAIN",
  176.                FA_Window_Title, "Crazy colors using Client.AddSignalHandler()",
  177.                FA_Window_Open,   TRUE,
  178.                
  179.                Child, VGroup, FA_Group_Rows, 2,
  180.                   Child, F_NewObj(cc -> Name,GaugeFrame, DontChain, TAG_DONE),
  181.                   Child, F_NewObj(cc -> Name,GaugeFrame, DontChain, TAG_DONE),
  182.                   Child, F_NewObj(cc -> Name,GaugeFrame, DontChain, TAG_DONE),
  183.                   Child, F_NewObj(cc -> Name,GaugeFrame, DontChain, TAG_DONE),
  184.                End,
  185.             End,
  186.          End;
  187.  
  188.          if (app)
  189.          {
  190.             F_Do(win,FM_Notify,FA_Window_CloseRequest,TRUE, app,FM_Application_Shutdown,0);
  191.             F_Do(app,FM_Application_Run);
  192.             F_DisposeObj(app);
  193.          }
  194.  
  195.          F_DeleteClass(cc);
  196.       }
  197.       else
  198.       {
  199.          Printf("Unable to create custom class.\n");
  200.       }
  201.  
  202.       CloseLibrary(FeelinBase);
  203.    }
  204.    else
  205.    {
  206.       Printf("Failed to open feelin.library.\n");
  207.    }
  208. }
  209. //+
  210.